package com.cskaoyan.javase.oop3.innerclazz6.local4.notice2.life;

/**
 * @description: 局部内部类对象和方法局部变量的生命周期对比
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 局部内部类对象要比局部变量活得更久
 * jvm放的副本啥时候消失：跟对象同生共死
 *
 * 虽然有副本 实际上还有问题：
 * 如果我在对象当中把我的副本改了,这个时候就需要同步去修改方法的局部变量
 * Java的开发者 觉得太TMD烦死了 于是做出了偷懒的行为：
 * 你不是想改吗？想让我同步吗？干脆谁都别改了
 * 直接就是常量 这样是最偷懒的设计
 * 对于程序员而言，这样设计可以大大简化工作量
 *
 * 在Java8之前，这个方法的局部变量中的final必须由程序员手动加上去的，但是8以后，Java开发者把这个final隐藏到了代码底层
 * 方法的可变参数：哪有什么岁月静好，都有人替你负重前行
 * 语法糖：底层帮你做，在开发的时候隐含
 * java开发者
 *
 */
public class Demo { //外部类
    public static void main(String[] args)  {
        EnclosedClazz enclosedClazz = new EnclosedClazz();
      Father f =   enclosedClazz.test(); //这里返回的实际是一个InnerSon对象
        //父类引用指向子类对象 多态调用

        f.testInner(); //这里已经没有a了
        //但是仍然能够打印a的值，说明jvm偷偷的帮我们做了一件事：把方法的局部变量a 塞到了对象当中

    }
}

class EnclosedClazz { //外围类
    public Father test() {
        //定义局部内部类 让它继承Father
        int a = 10; //当test调用结束 a就销毁了 无了
        class InnerSon extends Father{

            @Override
            public void testInner() {
                System.out.println("2");
                //a = 20;
                //System.out.println(a);
            }
        }
        //再次用a
        //创建局部内部类对象
        InnerSon is = new InnerSon();
        //我直接把这个对象作为返回值返回
        return is; //子类可以看成父类 向上转型 自动
        //is.test(); //2
    }

}

class Father {
    public void testInner() {
        System.out.println("1");
    }
}
